//
// Circular Linked List
// Created by Win10 on 2022/10/16.
//

#ifndef C_DATA_STRUCTURE_CL_LIST_H
#define C_DATA_STRUCTURE_CL_LIST_H

typedef struct LNode {
    int data;
    struct LNode* next;
}LNode, * LinkList;
//struct LNode*  == LinkList
//强调节点  用LNode
//强调链表  用LinkList

bool InitList(LinkList& L);

//按位查找，返回第i个元素（带头节点）
LNode* GetElem(LinkList L, int i);

//按值查找，找到数据域等于e的节点
LNode* LocateElem(LinkList L, int e);

//统计单链表的长度
int Length(LinkList L);

//后插操作，在节点p之后插入元素e
bool InsertNextNode(LNode* p, int e);

//带头节点的插入操作，在第i个位置插入元素e
bool ListInsert(LinkList& L, int i, int e);


//前插操作，在p节点前插入元素e
bool InsertPriorNode(LNode* p, int e);

//前插操作，在节点p之前插入节点s
bool InsertPriorNode(LNode* p, LNode* s);

//删除位序i的节点，e是i节点的值
bool ListDelete(LinkList& L, int i, int& e);

//删除指定节点P
bool DeleteNode(LinkList& L, LNode* p);

//尾插法，带头结点
LinkList List_TailInsert(LinkList& L);

//头插法，带头结点
LinkList List_HeadInsert(LinkList& L);

bool Empty(LinkList L);

//判断是否为表尾节点
bool isTail(LinkList L, LNode* p);

void print(LinkList L);


#endif //C_DATA_STRUCTURE_CL_LIST_H
